gtkbutton: Check release coordinates on all release event types
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 25 Sep 2020 17:10:46 +0000 (19:10 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 25 Sep 2020 17:20:04 +0000 (19:20 +0200)
The priv->in_button state that used to be relied upon for pointer
events has been reduced over time to a broken state, since the button
does not track crossing events anymore.

Make the coordinate-based checks apply for pointer events too, besides
touch events. This fixes GtkButton mistakenly emitting ::clicked with
pointer button releases outside the widget.

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3121
gtk/gtkbutton.c

index 1bacdc797b5b1490083a67e9c8f9a35e76b00431..f2e6701850125f6ff784463324874a3dff6ca3e5 100644 (file)
@@ -336,28 +336,6 @@ click_pressed_cb (GtkGestureClick *gesture,
     priv->button_down = TRUE;
 }
 
-static gboolean
-touch_release_in_button (GtkGestureClick *gesture,
-                         GtkWidget       *widget,
-                         double           x,
-                         double           y)
-{
-  GdkEvent *event;
-
-  event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture));
-
-  if (!event)
-    return FALSE;
-
-  if (gdk_event_get_event_type (event) != GDK_TOUCH_END)
-    return FALSE;
-
-  if (!gtk_widget_contains (widget, x, y))
-    return FALSE;
-
-  return TRUE;
-}
-
 static void
 click_released_cb (GtkGestureClick *gesture,
                    guint            n_press,
@@ -366,14 +344,12 @@ click_released_cb (GtkGestureClick *gesture,
                    GtkWidget       *widget)
 {
   GtkButton *button = GTK_BUTTON (widget);
-  GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
   GdkEventSequence *sequence;
 
   gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
   gtk_button_do_release (button,
                          gtk_widget_is_sensitive (GTK_WIDGET (button)) &&
-                         (priv->in_button ||
-                          touch_release_in_button (gesture, widget, x, y)));
+                         gtk_widget_contains (widget, x, y));
 
   sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));